package com.etime.shycourse.controller.wxcoupon;

import com.etime.shy.common.BaseMessage;
import com.etime.shy.common.ListMessage;
import com.etime.shy.common.PojoMessage;
import com.etime.shycourse.config.Tools;
import com.etime.shycourse.dto.*;
import com.etime.shycourse.services.wxcoupon.interfaces.WXCouponService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

@Api(tags = "微信-优惠券-与兑换券相关的controller接口")
@RestController
@RequestMapping("/wx/voucher")
public class WXCouponController {
    @Autowired
    private WXCouponService wxCouponService;

    @Autowired
    private Tools tools;
    /**
     * 获取我的优惠券列表；
     * 只查询出当前可以使用的优惠券；
     * 排序方法：按照到期时间升序排列
     * @param request
     * @return
     */
    @ApiOperation("我的优惠券-获取我的优惠券列表")
    @GetMapping("/getmycoupon")
    public ListMessage<CouponMyDto> selectMyCouponList(HttpServletRequest request){
        ListMessage<CouponMyDto> msg = new ListMessage<>();
        String token = request.getHeader("token");
        //String token = "1679091c5a880faf6fb5e6087eb1b2dc";
        //String token = "e4da3b7fbbce2345d7772b0674a318d5";
        CurrentUser currentUser = tools.getCurrentUserFromRedis(token);
        if (currentUser == null) {
            msg.setCode(-2);
            msg.setMsg("未获取到用户信息；可能登录超时或者非法访问。");
        }else{
            List<CouponMyDto> list = wxCouponService.selctMyCouponList(currentUser.getUser().getUserid());
            if(list!=null && list.size()>0){
                msg.setCode(1);
                msg.setDatalist(list);
            }else{
                msg.setCode(0);
                msg.setMsg("没有可用的优惠券!");
            }
        }
        return msg;
    }

    /**
     * 根据优惠券的id查询优惠券的使用范围。
     * 此接口主要用于兑换券使用中查询兑换券可以兑换的课程或者课程包
     * @param reciveid 优惠券id
     * @return
     */
    @ApiOperation("根据优惠券id查询优惠券详细信息以及优惠券的使用范围")
    @ApiImplicitParam(name ="reciveid",value = "优惠券领取id")
    @GetMapping("/getrange/{reciveid}")
    public PojoMessage<CouponAndRangeDto> selectVoucherRange(@PathVariable("reciveid") Integer reciveid){
        PojoMessage<CouponAndRangeDto> msg = new PojoMessage<>();
        //查询用户的优惠券信息
        CouponMyDto coupon = wxCouponService.selectCouponByReciveId(reciveid);
        if(coupon==null){
            msg.setCode(-4);
            msg.setMsg("非法操作，请联系管理员");
        }
        List<CouponRangeDto> list = wxCouponService.selectCouponRangeList(coupon.getCouponid());
        CouponAndRangeDto dto = new CouponAndRangeDto();
        if(list!=null && list.size()>0){
            msg.setCode(1);
            dto.setCoupon(coupon);
            dto.setCouponranglist(list);
            msg.setData(dto);
        }else{
            msg.setCode(0);
            msg.setMsg("该优惠券没有设置使用范围");
        }
        return msg;
    }

    /**
     * 使用兑换券兑换课程
     * 业务逻辑说明：
     * 1、判断用户是否登录，token是否存在。不存在返回-2
     * 2、判断，如果兑换的是课程包，则从课程包中查询出所有的课程列表。
     *    如果是课程，则需要获取到所有的课程列表
     * 3、保存优惠券的使用记录；
     * 4、保存优惠券使用记录日志；
     * 5、创建订单
     * 6、创建订单明细
     * @param param
     * @return
     */
    @ApiOperation("使用兑换券兑换课程/课程包")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "couponid",value = "优惠券id"),
            @ApiImplicitParam(name="couponreciveid",value = "优惠券领取id"),
            @ApiImplicitParam(name="courseorpackage",value = "兑换课程/课程包（1-课程；2-课程包）"),
            @ApiImplicitParam(name="idlist",value = "需要兑换的课程/课程包id的集合")
    })
    @PostMapping("/use")
    public BaseMessage useVoucher(@RequestBody UseVoucherParam param,HttpServletRequest request){
        BaseMessage msg = new BaseMessage();
        String token = request.getHeader("token");
        //String token = "1679091c5a880faf6fb5e6087eb1b2dc";
        //String token = "e4da3b7fbbce2345d7772b0674a318d5";
        CurrentUser currentUser = tools.getCurrentUserFromRedis(token);
        if (currentUser == null) {
            msg.setCode(-2);
            msg.setMsg("未获取到用户信息；可能登录超时或者非法访问。");
        }else{
            msg = wxCouponService.useVoucher(param,currentUser);
        }
        return msg;
    }
}
